package com.zkq.lvse.common.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.Map;

import org.hibernate.criterion.Criterion;

import com.zkq.lvse.common.utils.Page;

/**
 * 分页查询基类
 * 
 * @author zkq
 *
 * @param <T>
 * @param <PK>
 */
public interface BaseDao<T,PK extends Serializable> extends SimpleDao<T,PK> {
	/**
	 * 分页查询全部对象列表
	 * @param page
	 * @return
	 */
	public Page<T> getAll(final Page<T> page);
	/**
	 * 根据HQL分页查询对象列表
	 * @param page	分页参数
	 * @param hql	HQL
	 * @param values	数量可变参数，按顺序绑定
	 * @return
	 */
	public Page<T> findPage(final Page<T> page,final String hql,Object... values);
	/**
	 * 根据HQL分页查询对象列表
	 * @param page	分页参数
	 * @param hql	HQL
	 * @param values	数量可变参数，按名称绑定
	 * @return
	 */
	public Page<T> findPage(final Page<T> page,final String hql,Map<String, ?> values);
	/**
	 * 根据Criteria分页查询对象列表
	 * @param page	分页参数
	 * @param criterions	数量可变Criterion参数，按顺序绑定
	 * @return
	 */
	public Page<T> findPage(final Page<T> page,final Criterion... criterions);
	/**
	 * 根据ID列表分页查询对象列表
	 * @param page	分页参数
	 * @param ids	ID列表
	 * @return
	 */
	public Page<T> findPage(final Page<T> page,final Collection<PK> ids);
	/**
	 * 根据SQL语句分页查询对象列表
	 * @param page	分页参数
	 * @param sql	sql语句
	 * @param clz	实体类class
	 * @return
	 */
	public Page<T> findPage(final Page<T> page,final String sql,final Class<T> clz);
	/**
	 * 根据SQL语句分页查询对象列表
	 * @param page	分页参数
	 * @param sql	sql语句
	 * @param clz	实体类class
	 * @param vlaues	数量可变参数，按顺序绑定
	 * @return
	 */
	public Page<T> findPage(final Page<T> page,final String sql,final Class<T> clz,final Object... vlaues);
	/**
	 * 根据HQL查询对象总量
	 * @param hql	HQL语句
	 * @param values	数量可变参数，按顺序绑定
	 * @return
	 */
	public long count(final String hql,final Object... values);
}
